﻿namespace Digitalmes.Infrastructure.Jobs;

/// <summary>
/// 定时任务特性。
/// </summary>
/// <param name="identity">标识，必须必须唯一。</param>
/// <param name="cron">cron 表达式</param>
/// <param name="group">标识分组</param>
/// <param name="description">Job 描述</param>
/// <remarks>
/// Job 添加到 Job 后会自动注册到 Quartz 计划任务中。
/// </remarks>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class JobScheduleAttribute(string identity, string cron, string? group = null, string? description = null) : Attribute
{
    /// <summary>
    /// Job 标识，必须必须唯一。
    /// </summary>
    public string Identity { get; } = identity;

    /// <summary>
    /// 标识分组。
    /// </summary>
    public string? Group { get; } = group;

    /// <summary>
    /// cron 表达式。
    /// </summary>
    /// <remarks>
    /// <para>常用的Cron表达式示例：</para>
    /// <para>"*/5 * * * * ?" => 每5秒触发一次</para>
    /// <para>"0 */5 * * * ?" => 每5分钟触发一次</para>
    /// <para>"0 0 12 * * ?" => 每天中午12:00触发一次</para>
    /// <para>"0 * 14 * * ?" => 每天14:00到14:59，每分钟触发一次</para>
    /// <para>"0 0/5 14 * * ?" => 每天14:00到14:59，每5分钟触发一次</para>
    /// <para>"0 0/5 14,18 * * ?" => 每天14:00到14:55，以及18:00到18:55，每5分钟执行一次</para>
    /// <para>"0 0-5 14 * * ?" => 每天14:00到14:05，每分钟触发一次</para>
    /// <para>"0 15 10 ? * MON-FRI" => 每周一到周五，每天10:15 触发一次</para>
    /// 更多信息参考：https://www.quartz-scheduler.net/documentation/quartz-3.x/how-tos/crontrigger.html
    /// </remarks>
    [NotNull]
    public string? Cron { get; } = cron;

    /// <summary>
    /// Job 描述
    /// </summary>
    public string? Description { get; } = description;
}
